package com.agent.tools;

import com.agent.entity.Activities;
import com.agent.service.ActivitiesService;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

/*
    有关活动、计划、行程等记录的工具类

 */

@Component
public class ActivityRecordTools {

    @Autowired
    private ActivitiesService activitiesService;

    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("H:mm");
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-M-dd");

    // 新增活动
    @Tool(name = "record_activity",
            value = "根据用户提供的事件、日期、地址等信息记录保存活动、计划、行程等安排。必须传递事件概述、日期、地点和用户id参数；开始时间、结束时间、是否全天为可选参数。当缺少必要信息时会提示用户补充，等补充完后再调用此工具！")
    public String recordActivity(
            @P(value = "userId") Long userId,  // 显式传递用户ID
            @P(value = "事件概述。如：去成都金牛区参加漫展，事件概述为参加漫展，地点为成都金牛区") String activity,
            @P(value = "日期（yyyy-M-dd）") LocalDate dateStr,
            @P(value = "开始时间（HH:mm）", required = false) LocalTime startTimeStr,
            @P(value = "结束时间（HH:mm）", required = false) LocalTime endTimeStr,
            @P(value = "是否持续全天。0 表示不持续全天，1 表示持续全天") Integer allDay,
            @P(value = "星期几，1-7表示星期一到星期天") Integer week,
            @P(value = "地点") String address
    ) {
        // 获取用户id
        System.out.println("用户id：" + userId);
        // 封装活动信息
        Activities activities = Activities.builder()
                .activity(activity)
                .date(dateStr)
                .startTime(startTimeStr) // 使用LocalTime解析时间
                .endTime(endTimeStr)       // 使用LocalTime解析时间
                .allDay(allDay)
                .week(week)
                .address(address)
                .userId(userId)
                .build();

        System.out.println("记录活动：" + activities);

        // 检查时间冲突
        List<Activities> conflicts = activitiesService.checkConflicts(userId, activities.getDate(), activities.getStartTime(), activities.getEndTime());

        // 构建返回消息
        StringBuilder result = new StringBuilder();
        // 如果有时间冲突，提醒用户
        if (!conflicts.isEmpty()) {
            result.append("\n⚠️ 注意：该时间段与以下活动可能存在冲突：\n");
            for (Activities conflict : conflicts) {
                result.append("- ").append(conflict.getActivity());
                if (conflict.getAllDay() == 1) {
                    result.append("（全天）");
                } else {
                    result.append("（").append(conflict.getStartTime() !=  null ? conflict.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")) : "");
                    if (conflict.getEndTime() != null) {
                        result.append("-").append(conflict.getEndTime() != null ? conflict.getEndTime().format(DateTimeFormatter.ofPattern("HH:mm")) : "");
                    }
                    result.append("）");
                }
                result.append("\n");
            }
             /*
            输出结果示例：
                ⚠️ 注意：该时间段与以下活动可能存在冲突：
                    - 会议A（10:00-11:00）
                    - 会议B（全天）
            */
            return result.toString();
        }

        // 记录活动
        activitiesService.save(activities);

//        Activities recordedActivity = activitiesService.recordActivity(
//                userId, activities.getActivity(), activities.getStartTime(),
//                activities.getEndTime(), activities.getAllDay(), activities.getDate(),
//                activities.getAddress(), activities.getWeek());

        result.append("✅ 活动记录成功！\n");
        result.append("📅 活动：").append(activity).append("\n");
        result.append("📆 日期：").append(activities.getDate().format(DATE_FORMATTER)).append("\n");

        if (allDay != null && allDay == 1) {
            result.append("⏰ 时间：全天\n");
        } else {
            result.append("⏰ 开始时间：").append(activities.getStartTime() != null ? activities.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")) : "").append("\n");
            if (activities.getStartTime() != null) {
                result.append("⏰ 结束时间：").append(activities.getEndTime() != null ? activities.getEndTime().format(DateTimeFormatter.ofPattern("HH:mm")) : "").append("\n");
            }
        }
        /*
        输出结果示例：
            ✅ 活动记录成功！
            📅 活动：团队会议
            📆 日期：2023-12-25
            ⏰ 开始时间：14:00
            ⏰ 结束时间：16:00
        或者
            ✅ 活动记录成功！
            📅 活动：年假
            📆 日期：2023-12-25
            ⏰ 时间：全天
         */
        return result.toString();
    }

    // 查询指定日期的活动安排
    @Tool(name = "query_activities_by_date",
            value = "根据日期查询指定用户id的活动安排，可选择性指定开始时间和结束时间范围来筛选活动")
    public String getActivitiesByDate(
            @P(value = "查询日期，格式为yyyy-M-dd，例如2023-12-25") LocalDate dateStr,
            @P(value = "userId") Long userId,
            @P(value = "开始时间范围，格式为HH:mm，可选参数，用于筛选该时间之后开始的活动", required = false) LocalTime startTimeStr,
            @P(value = "结束时间范围，格式为HH:mm，可选参数，用于筛选该时间之前结束的活动", required = false) LocalTime endTimeStr)
    {
        System.out.println("用户id：" + userId);
        System.out.println("查询指定日期的活动安排：" + dateStr);
        // 获取活动列表
        List<Activities> activities = activitiesService.getActivitiesByDate(userId, dateStr, startTimeStr, endTimeStr);

        StringBuilder result = new StringBuilder();
        if (activities.isEmpty()) {
            return "📅 " + dateStr + " 暂无安排";
        }
        result.append("📅 ").append(dateStr).append(" 的活动安排：\n\n");
        for (Activities activity : activities) {
            result.append("• ").append(activity.getActivity()).append("\n");
            if (activity.getAllDay() == 1) {
                result.append("  ⏰ 全天\n");
            } else {
                result.append("  ⏰ ").append(activity.getStartTime() != null ? activity.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")) : "");
                if (activity.getEndTime() != null) {
                    result.append(" - ").append(activity.getEndTime() != null ? activity.getEndTime().format(DateTimeFormatter.ofPattern("HH:mm")) : "");
                }
                result.append("\n");
            }
            result.append("\n");
        }
        /*
        输出结果示例：
            📅 2023-12-25 的活动安排：

            • 团队会议
              ⏰ 14:00 - 16:00

            • 午餐约会
              ⏰ 12:30 - 13:30

            • 年假
              ⏰ 全天

            • 晚上跑步
              ⏰ 19:00
         */
        return result.toString();
    }

    // 删除指定用户id的指定日期的活动安排
}
